package de.preisrobot.persistence.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import de.preisrobot.entity.AmazonArtikelImage;
import de.preisrobot.entity.Artikel;

@Repository
public class ArtikelDaoImpl implements ArtikelDao {

    private static Logger log = Logger.getLogger(ArtikelDaoImpl.class);

    private static String ARTIKEL_TABLE = Artikel.class.getSimpleName();

    @PersistenceContext
    EntityManager em;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(Object a) {
        try {
            em.persist(a);
        } catch (Exception e) {
            log.error(e.getMessage());
        }

    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public long saveArtikel(Artikel a) {
        em.persist(a);
        return a.getId();

    }

    @Override
    public Artikel find(String arikelNr) {

        String sql = "select c from Artikel  c where c.artikelNr =  ?1 ";
        Query createQuery = em.createQuery(sql);
        createQuery.setParameter(1, arikelNr);

        List<Artikel> resultList = createQuery.getResultList();

        if (resultList != null && !resultList.isEmpty())
            return resultList.get(0);

        return null;
    }

    @Override
    public Artikel findById(long id) {

        return em.find(Artikel.class, id);
    }

    @Override
    public AmazonArtikelImage getImage(String string) {
        String sql = "select c from AmazonArtikelImage c where artikelNr='?1'";
        Query createQuery = em.createQuery(sql);
        createQuery.setParameter(1, string);
        return (AmazonArtikelImage) createQuery.getSingleResult();
    }

    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public AmazonArtikelImage find(long id) {

        return em.find(AmazonArtikelImage.class, id);
    }

    @Override
    public List<Artikel> findArtikelOhneBild() {
        String sql =
                "select a.* from  artikel a left join artikelimage i "
                        + " on a.id = i.artikelid where i.artikelid is null";

        Query createNativeQuery = em.createNativeQuery(sql, Artikel.class);
        List<?> resultList = createNativeQuery.getResultList();

        return (List<Artikel>) resultList;

    }

    @Override
    public List<Artikel> findArtikel(String query) {

        Query createNativeQuery = em.createNativeQuery(query, Artikel.class);
        List<?> resultList = createNativeQuery.getResultList();

        return (List<Artikel>) resultList;

    }

    @Override
    public List<AmazonArtikelImage> getallPictures() {
        String sql = "select a.* from  artikelimage a ";

        Query createNativeQuery = em.createNativeQuery(sql, AmazonArtikelImage.class);
        List<?> resultList = createNativeQuery.getResultList();

        return (List<AmazonArtikelImage>) resultList;

    }

    @Override
    public AmazonArtikelImage getImageByArtikelId(long parseLong) {
        String sql = "select a from AmazonArtikelImage a where a.artikelId = ?1";
        Query createQuery = em.createQuery(sql);
        createQuery.setParameter(1, parseLong);
        List<AmazonArtikelImage> images = createQuery.getResultList();
        if (images != null && !images.isEmpty())
            return images.get(0);

        return null;

    }

    @Override
    public List<Artikel> findArtikelByAnbieter(int anbieterId) {
        Query createQuery =
                em.createQuery("select a from " + ARTIKEL_TABLE + " a where a.anbieterId= ?1 order by a.creationDate ");
        createQuery.setParameter(1, anbieterId);

        return createQuery.getResultList();

    }

    @Override
    public List<Artikel> findAll(String string) {
        String sql = "select c from AmazonArtikel  c where c.artikelNr like  ?1 ";
        Query createQuery = em.createQuery(sql);
        createQuery.setParameter(1, string);

        List<Artikel> resultList = createQuery.getResultList();
        return resultList;
    }

    @Override
    public List<Artikel> getAll() {
        String sql = "select c from " + Artikel.class.getSimpleName() + " c   ";

        Query createQuery = em.createQuery(sql);
        List<Artikel> resultList = createQuery.getResultList();

        return resultList;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateImage(AmazonArtikelImage a) {
        try {
            AmazonArtikelImage find = em.find(AmazonArtikelImage.class, a.getId());
            find.setTyp(a.getTyp());
            em.persist(find);
        } catch (Exception e) {
            log.error("error update", e);
        }
    }

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    @Override
    public void merge(Artikel findById) {

        em.merge(findById);

    }

}
